﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using FinanSoft.Utilities;

namespace FinanSoft.Entities

{
    public class AccountingEntryDetail
    {
        #region Constructors
        /// <summary>
        /// Constructor de la clase. Recibe parametros para todos los atributos del detalle del asiento
        /// </summary>
        public AccountingEntryDetail(int id, FinanSoft.Entities.Account account, Constants.AccountingEntryType type, double sysAmmount, double locAmmount)
        {
            this.Id = id;
            this.Account = account;
            this.Type = type;
            this.SysAmmount = sysAmmount;
            this.LocAmmount = locAmmount;
            this.AuxiliarAccountId = Constants.INVALID_ID;
        }

        /// <summary>
        /// Constructor por defecto de la clase
        /// </summary>
        public AccountingEntryDetail()
        {
            
        }
        #endregion

        #region Properties
        /// <summary>
        /// El Id que identifica de manera unica este detalle dentro del asiento particular
        /// </summary>
        public int Id
        {
            get;
            set;
        }

        /// <summary>
        /// Cuenta modificada por el asiento
        /// </summary>
        public FinanSoft.Entities.Account Account
        {
            get;
            set;
        }

        /// <summary>
        /// Tipo de crecimiento del asiento
        /// </summary>
        public Constants.AccountingEntryType Type
        {
            get;
            set;
        }

        /// <summary>
        /// Monto en moneda del systema del asiento
        /// </summary>
        public double SysAmmount
        {
            get;
            set;
        }

        /// <summary>
        /// Monto en moneda local del asiento
        /// </summary>
        public double LocAmmount
        {
            get;
            set;
        }

        /// <summary>
        /// Posee el id de la cuenta auxiliar de este detalle. Si la cuenta no posee cuenta auxiliar este valor debería retornar
        /// Constants.INVALID_ID
        /// </summary>
        public int AuxiliarAccountId
        {
            get;
            set;
        }
        #endregion        

        #region Methods
        /// <summary>
        /// Devuelve la información de los atributos de la instancia como un nodo XML
        /// </summary>
        /// <param name="doc">El documento XML al que se adjuntara el nuevo elemento creado apartir del detalle del asiento</param>
        /// <returns></returns>
        public XmlDocument ToXML(XmlDocument doc)
        {
            XmlElement newElement;
            XmlAttribute newAttribute;

            newElement = doc.CreateElement(Constants.NODE_NAME_ACCOUNT);

            newAttribute = doc.CreateAttribute(Constants.TAG_NAME_ACCOUNTING_ENTRY_DETAIL_ID);
            newAttribute.Value = Convert.ToString(this.Id);
            newElement.SetAttributeNode(newAttribute);

            newAttribute = doc.CreateAttribute(Constants.TAG_NAME_ACCOUNTING_ENTRY_ACCOUNT_ID);
            newAttribute.Value = Convert.ToString(this.Account.AccountID);
            newElement.SetAttributeNode(newAttribute);

            newAttribute = doc.CreateAttribute(Constants.TAG_NAME_ACCOUNTING_ENTRY_TYPE);
            newAttribute.Value = this.Type == Constants.AccountingEntryType.credit ? Constants.TAG_NAME_ACCOUNTING_ENTRY_TYPE_CREDIT : Constants.TAG_NAME_ACCOUNTING_ENTRY_TYPE_DEBIT;
            newElement.SetAttributeNode(newAttribute);

            newAttribute = doc.CreateAttribute(Constants.TAG_NAME_AMMOUNT);
            newAttribute.Value = LocAmmount.ToString("0.00").Replace(',', '.');
            newElement.SetAttributeNode(newAttribute);

            newAttribute = doc.CreateAttribute(Constants.TAG_NAME_ACCOUNTING_ENTRY_AUX_ACCOUNT_ID);
            newAttribute.Value = Convert.ToString(this.AuxiliarAccountId);
            newElement.SetAttributeNode(newAttribute);

            doc.DocumentElement.AppendChild(newElement);

            return doc;
        }
        #endregion
    }
}
